在版本控制系統中 Monorepo 和 Polyrepo 分別是兩種用來管理模組化程式碼的軟體開發策略。
以男女之間來說,就像是金錢是要分開管理 (Poly) 或是一起管理 (Mono),即使一起管理是單純全部丟在一起 (Monolith) 還是有做簡單的分類 (Monorepo) 像是個人花費和公共花費等等。
? 小編點評: 該分開就早點分開,這個道理在哪似乎都適用
接下來這篇文章以前後端分離的 Web 開發為例來分析 Monorepo 和 Polyrepo,另外 Monolith 可以看成缺少規劃的 Monorepo 原則上是將讓專案可運行的相關程式全部放一起,常在專案初期 POC 使用,這個名詞基本不用管。
圖片來源: https://codefresh.io/blog/using-codefresh-with-mono-repos/
Polyrepo 則是把前端與後端分為兩個不同的 Repository,目前絕大多數專案的管理方式
把不同功能的專案分成不同的 Repository 管理
功能開發階段,前後端溝通成本較難下降?!
Polyrepo 前後端各自開工,當需要整合測試的時候就會需要
共用元件的開發與測試流程較多手工且繁雜的部分
UI 共用元件通常會把元件封裝成 package 或透過 git 的 URL 來 npm install
開發階段測試流程,維護共同相關 dependencies 成本較高
Polyrepo CI/CD 每次進版或退版較複雜
Polyrepo CI/CD 在做用戶端 APP 會很常區分 dev、uat、production 環境並以三或多個 branch 做區分。
舉小編前公司的案例來說,除了公版的功能外,剩下每個客戶因為有相對應的客製化,若無法用 config 解決就會另外開新分支維護,這樣的情況下如果需要更新 UAT 的版本,就要在各個 Repository 做重複 N 次的操作,如果今天 CI/CD 流程因應公司政策有修改也需要在 N 個地方配合修正。
Monorepo 是把前端與後端的原始碼都放在同個 Repository,是軟體開發過程中,使用一個 Repository 開發多個模組或專案的方式。
Facebook 的 React 其實就是 Monorepo。
將相關程式碼依照特定的邏輯,包含前後端放在同個 Repository
以小編前公司的經驗來說,覺得 monorepo 的概念就蠻適合部門內整合各模組的專案架構。
因為只有一個 Repo 所以權限也只有一種,不過理論上同部門也不需要過於詳細的權限控制。
雖然當專案過大的時候 git 操作會變慢,可以指定 clone 深度來解決。
npm 沒辦法用 install github url 的方式安裝模組,有個招式是可以開個 Branch 專門放 build 過的結果,但繁雜程度可能跟 Polyrepo 差不多。
統一的設定及專案技術選型
Nx 是使用 TypeScript 撰寫的 Monorepo 專案建置工具,官網介紹是
Smart, Fast, Extensible Build System
主要協助建構與整合 Monorepo 架構,並內建支援
Nx 在不使用任何外掛的情況下也可以方便地去使用,雖然主要以 JavaScript 生態系為主但因為可以使用外掛擴充,其實可以發現社群對於其他語言也有相關的支援,像是常見的 nx-spring-boot。
Nx 的專案架構如下
NxProject/
├── apps/
├── libs/
├── tools/
├── workspace.json
├── nx.json
├── package.json
└── tsconfig.base.json
Demo Repo:
https://github.com/LinYenCheng/monorepo-demo
另外因為 Nx 功能蠻多的若是使用 VS Code 開發,建議安裝 Nx 擴充套件,就不必將指令記起來,舉三個常用的例子
npx nx print-affected
: 找出這次改動被影響需要修改跟重新 build 跟 test 的專案npx nx run-many -target=serve --project=api, demo
: 一次執行多個專案像是同時把前後端跑起來npx nx graph
: 透過互動式介面了解專案相依性